#include "ControlCamaras.h"

#include <glm\gtc\matrix_transform.hpp>


ControlCamaras::ControlCamaras(int ancho, int alto) : 
	m_camara_primera_persona(alto, ancho, 45.0f),
	m_camara_cabina_grua(alto, ancho, 45.0f)
{
	this->m_camaraActual = &this->m_camara_primera_persona;
}


void ControlCamaras::init(const glm::vec3 &camUnoPosicion, const glm::vec3 &camUnoTarget, const glm::vec3 &camUnoUp,
		const glm::vec3 &camDosPosicion, const glm::vec3 &camDosTarget, const glm::vec3 &camDosUp) 
{
	// Hay que inicializar todas las camaras por separado para evitar problemas con el cambio de camara activa
	this->m_camara_primera_persona.init(camUnoPosicion, camUnoTarget, camUnoTarget);
	this->m_camara_cabina_grua.init(camDosPosicion, camDosTarget, camDosUp);

	// TODO: Inicializar las otras camaras
}


void ControlCamaras::zoomIn(ZOOM_TYPE z){
	this->m_camaraActual->zoomIn(z);
}


void ControlCamaras::mouseMove(int viewportPosX, int viewportPosY){
	this->m_camaraActual->mouseMove(viewportPosX, viewportPosY);
}


void ControlCamaras::moverCamara(MOVE_TYPE direccion, float magnitud){
	this->m_camaraActual->moverCamara(direccion, magnitud);
}


// Separando la camara de la grua es la mejor forma que se me ocurrio ahora
// para solucionar el problema de que no se muevan todas las camaras
void ControlCamaras::moverCamaraGrua(MOVE_TYPE direccion, float magnitud) {
	this->m_camara_cabina_grua.moverCamara(direccion, magnitud);
}


const glm::mat4 ControlCamaras::getViewMatrix() const {
	return this->m_camaraActual->getViewMatrix();
}


const glm::mat4 ControlCamaras::getProjectMatrix() const {
	return this->m_camaraActual->getProjectMatrix();
}


void ControlCamaras::cambiarCamara(TIPO_CAMARA tc) {
	switch (tc) {
		case TIPO_CAMARA::PRIMERA_PERSONA:
			this->m_camaraActual = &this->m_camara_primera_persona;
			break;

		case TIPO_CAMARA::VISTA_GRUA:
			this->m_camaraActual = &this->m_camara_cabina_grua;
			break;

		case TIPO_CAMARA::VISTA_AEREA:
			// TODO: Asignar la camara de la vista aerea
			break;
	}
}

